package reflectx

import (
	"fmt"
	"reflect"
)

// SetField 用于反射设置结构体字段
func SetField(v reflect.Value, fieldName, value string) error {
	field := v.FieldByName(fieldName)
	if !field.IsValid() {
		return fmt.Errorf("no such field: %s in obj", fieldName)
	}

	if !field.CanSet() {
		return fmt.Errorf("cannot set %s field value", fieldName)
	}

	switch field.Kind() {
	case reflect.String:
		field.SetString(value)
	// 可以根据需要添加更多类型的处理
	default:
		return fmt.Errorf("unsupported kind %s", field.Kind())
	}
	return nil
}

func FuncExec[T any](structTyp T) {
	// 获取类型信息
	t := reflect.TypeOf(structTyp)
	// 获取值信息
	v := reflect.ValueOf(structTyp)
	// 遍历方法并执行
	for i := 0; i < t.NumMethod(); i++ {
		if t.Method(i).Name != "Initialize" {
			m := v.Method(i)
			m.Call(nil) // 调用方法，传入nil因为方法不接受任何参数
		}
	}
}

func FuncExecByName[T any](structTyp T, funcName string, inSlice ...[]reflect.Value) []reflect.Value {
	var in []reflect.Value
	if len(inSlice) > 0 {
		in = inSlice[0]
	}

	// 获取值信息
	v := reflect.ValueOf(structTyp)

	m := v.MethodByName(funcName)
	return m.Call(in) // 调用方法，传入nil因为方法不接受任何参数
}

func TypName[T any]() string {
	//if len(nameSlice) > 0 {
	//	return nameSlice[0]
	//}

	// 获取T的反射类型
	typ := reflect.TypeOf((*T)(nil)).Elem()
	return typ.Elem().Name()
}

func NewInstance[T any]() T {
	// 获取T的反射类型
	typ := reflect.TypeOf((*T)(nil)).Elem()

	// 创建实例
	var instance T
	if typ.Kind() == reflect.Ptr {
		// 如果T是指针类型，创建一个指针实例
		instance = reflect.New(typ.Elem()).Interface().(T)
	} else {
		// 如果T是值类型，创建一个值实例
		instance = reflect.New(typ).Elem().Interface().(T)
	}

	// 返回创建的实例
	return instance
}
